added gggl backing conversions
authorØyvind Kolås <ok@src.gnome.org>
Wed, 22 Feb 2006 12:58:25 +0000 (12:58 +0000)
committerØyvind Kolås <ok@src.gnome.org>
Wed, 22 Feb 2006 12:58:25 +0000 (12:58 +0000)
ChangeLog
extensions/gggl.c

index e26caf1bc36b29be258785a69bc673c2e461c300..f256752126f4cb538e7d7985b918ddf276be011e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-22  Øyvind Kolås  <pippin@gimp.org>
+
+       * extensions/gggl.c: (conv_rgbaF_rgb8), (conv_rgbAF_rgbF), (init):
+       added two more conversions for gggl usage.
+
 2005-12-17  Michael Schumacher  <schumaml@cvs.gnome.org>
 
        * extensions/Makefile.in: add libgw32 and its dependencies to
index e26ab72f811f53facb94577b9962e0c776042e1a..bf3fe83c8bfe61335e59811fa79ad3f693c342cf 100644 (file)
@@ -49,7 +49,7 @@
  *       gamma correction  (not really,. gamma correction belongs in seperate ops,.
  */
 
-//#define USE_TABLES
+#define USE_TABLES
 #ifdef USE_TABLES
 
 /* lookup tables used in conversion */
@@ -337,6 +337,34 @@ conv_8_16 (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
+static INLINE long
+conv_rgbaF_rgb8 (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n=samples;
+  while (n--)
+  {
+      register float f = (*(float *) src);
+      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
+      src += 4;
+      dst += 1;
+
+      f = (*(float *) src);
+      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
+      src += 4;
+      dst += 1;
+
+      f = (*(float *) src);
+      *(unsigned char *) dst = table_F_8[gggl_float_to_index16 (f)];
+      src += 4;
+      dst += 1;
+
+      src += 4;
+
+  }
+  return samples;
+}
+
+
 /*********/
 static INLINE long
 conv_rgbaF_rgba8 (unsigned char *src, unsigned char *dst, long samples)
@@ -581,6 +609,49 @@ conv_rgbAF_rgbaF (unsigned char *src, unsigned char *dst, long samples)
   return samples;
 }
 
+
+static INLINE long
+conv_rgbAF_rgbF (unsigned char *src, unsigned char *dst, long samples)
+{
+  long n=samples;
+  while (n--)
+    {
+      float     alpha = (((float *) src)[3]);
+      if (alpha >= 1.0)
+        {
+          register int       c;
+          for (c = 0; c < 3; c++)
+            {
+              *(float *) dst = *(float *) src;
+              dst += 4;
+              src += 4;
+            }
+        }
+      else if (alpha <= 0.0)
+        {
+          register int       c;
+          for (c = 0; c < 3; c++)
+            {
+              *(float *) dst = 0;
+              dst += 4;
+              src += 4;
+            }
+        }
+      else
+        {
+          register int       c;
+          for (c = 0; c < 3; c++)
+            {
+              *(float *) dst = ((*(float *) src) / alpha);
+              dst += 4;
+              src += 4;
+            }
+        }
+      src += 4;
+    }
+  return samples;
+}
+
 static INLINE long
 conv_rgbaF_rgbAF (unsigned char *src, unsigned char *dst, long samples)
 {
@@ -2014,6 +2085,8 @@ init (void)
   o (rgbaF, yuvaF);
   o (rgbaF, rgbaD);
   o (rgbaD, rgbaF);
+  o (rgbaF, rgb8);
+  o (rgbAF, rgbF);
 #if 0
   o (rgbF, xyzF);
   o (xyzF, rgbF);